Computer systems use memory (such as random-access memory [“RAM”], dynamic random-access memory [“DRAM”], and flash memory) and nonvolatile storage devices (such as magnetic or optical disk drives) to store information. Disk storage is usually much slower than memory. Thus, disk input/output [“I/O”] operations (e.g., disk reads and writes) can be a speed bottleneck for response times in a computer system.
In general, a computer system with random-access memory and a hard disk drive will perform a task more quickly if the information the computer needs to perform the task can be stored in memory. The more times a computer has to access information stored on a disk drive to perform a task, the slower its performance is likely to be. For example, hard disk drives with magnetic disks use disk arms and read heads to access information on the disks. Although the speed of disk arms and the rotational speed of disks have improved, disk drive mechanics remain a bottleneck for accessing information stored on the drive because the information capacities of disks have increased more rapidly. The greater speed of the disk arms and read heads has been countered by the increasing amount of information that they are required to cover.
Other forms of nonvolatile storage (e.g., tape drives, CD-ROM drives, CD-RW drives, and DVD drives) have different physical characteristics but often face similar challenges in terms of response times. For example, in a CD or DVD drive, a laser beam must be directed to different locations to read the information stored on the disk. The time it takes to position the laser beam to read the desired information is often slow when compared to response times for accessing information in volatile memory.
One way to increase system speed is to increase memory size. In volatile memory such as RAM or DRAM, information is not stored permanently. Information in volatile memory is overwritten as needed to accommodate the tasks that the system is currently performing. With increased memory, more information can remain accessible without performing disk reads. However, due to cost constraints, the amount of available volatile memory in a computer system is generally much smaller than the available disk storage. In addition, information in volatile memory can be lost completely when the flow of electrical power to the computer system is stopped.
Because it is generally not practical or desirable to rely exclusively on increases in volatile memory to increase system speed, several attempts have been made to optimize disk I/O operations. Some approaches to disk I/O optimization try to reduce the total number of disk I/O operations. Such approaches include caching, prefetching, write buffering, and request scheduling. In read caching, data that has been requested is read from a disk and temporarily stored in cache memory, where it can be accessed quickly if another request is made for the same data. In prefetching, data on a disk that is likely to be needed in the future is read from the disk ahead of time, before it is actually needed. In write buffering, written data is temporarily held in memory before being written to disk in order to regulate the flow of disk writes, which tend to occur in bursts. In request scheduling, disk requests are queued and scheduled in order to reduce the average response time for each request (e.g., by making more efficient use of disk arm movements).
Other approaches attempt to reduce the response time needed for individual disk I/O operations (such as by reducing seek times). These approaches include disk defragmenting. In some defragmenting techniques, information on a disk is re-organized to close gaps on the disk that are left when data is deleted, leaving unused disk space interspersed with data that is still in use. Although such defragmenting techniques can reduce the area of the disk that needs to be searched, information that is needed for a task may still be scattered in different areas of a defragmented disk. In another approach, a disk is organized by ordering disk blocks used by certain software applications in order to improve load times for the applications. This approach improves performance at application start-up time, but it lacks the ability to perform other kinds of optimizations, such as when an application is running.
Whatever the benefits of previous techniques, they do not have the advantages of the following techniques and tools.